package matheus.tp01cg.objetosdedesenho;

/**
 * Coordenadas do plano cartesiano e implementacao de transformacoes geometricas
 * 
 * @author matheus
 * 
 */
public final class Coords implements Cloneable {
	public int x, y;

	public Coords(int x, int y) {
		this.x = x;
		this.y = y;
	}

	/**
	 * Rotaciona o ponto baseado em um ponto de referencia e no angulo (em
	 * radianos)
	 * 
	 * @param centro
	 *            Ponto de referencia para rotacao
	 * @param angulo
	 *            Em radianos
	 */
	public void rotaciona(Coords centro, double angulo) {
		double sinT = Math.sin(angulo);
		double cosT = Math.cos(angulo);

		double xOrig = (double) (x - centro.x);
		double yOrig = (double) (y - centro.y);

		int novoXorig = (int) Math.round(xOrig * cosT - yOrig * sinT);
		int novoYorig = (int) Math.round(xOrig * sinT + yOrig * cosT);

		this.x = novoXorig + centro.x;
		this.y = novoYorig + centro.y;
	}

	/**
	 * Translacao do ponto
	 * 
	 * @param x
	 *            Deslocamento no eixo X (em Pixels)
	 * @param y
	 *            Deslocamento no eixo Y (em Pixels)
	 */
	public void translada(int x, int y) {
		this.x += x;
		this.y += y;
	}

	/**
	 * Redimensionamento do ponto (reposicionamento)
	 * 
	 * @param ref
	 *            Ponto de referencia
	 * @param x
	 *            Fator de escala no eixo X (< 1.0 reducao, > 1.0 ampliacao)
	 * @param y
	 *            Fator de escala no eixo Y (< 1.0 reducao, > 1.0 ampliacao)
	 */
	public void escala(Coords ref, double x, double y) {
		double xRef = this.x - ref.x;
		double yRef = this.y - ref.y;
		xRef *= x;
		yRef *= y;
		this.x = (int) Math.round(xRef + ref.x);
		this.y = (int) Math.round(yRef + ref.y);
	}

	/**
	 * Realiza uma copia do ponto
	 */
	@Override
	public Object clone() throws CloneNotSupportedException {
		return (Object) (new Coords(x, y));
	}
}
